unit uExpExcel_HB;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls,db,dbtables, Mask, ToolEdit, mxExport, Gauges;

type
  TfrmConfrontoCargaXEstoque = class(TForm)
    SG: TStringGrid;
    GroupBox1: TGroupBox;
    DateEdit1: TDateEdit;
    DateEdit2: TDateEdit;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    exporta: TmxStringGridExport;
    pb: TGauge;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure CargasPeriodo(pDtI,pDtF: TDateTime; var tq: TQuery);
    procedure CarregaProdutos(var tq: TQuery);
    function SaldoAnterior(pDt: TDateTime; pProd: String):Double;
    function TotEntrada(pDt: TDateTime; pProd: String):Double;
    function TotCarga(pCarga,pProd: String):Double;
    function  RetornaCarteiraVolumes(prod_cod: String): Double;
    function  QtdeProducao(p_Cargas,p_Prod: String):Double;
  public
    { Public declarations }
    alocacao  : Integer;
  end;

var
  frmConfrontoCargaXEstoque: TfrmConfrontoCargaXEstoque;
  p_DataIni,
  p_DataFim : TDateTime;
  col,lin   : Integer;
  xcargas   : String;


implementation

uses clsProduto, Biblio, Dm, clsVolumes;

var
 Produto: TProduto;

{$R *.dfm}

procedure TfrmConfrontoCargaXEstoque.Button1Click(Sender: TObject);
var
 p_Data   : TDateTime;
 tq       : TQuery;
 i,c,l    : Integer;
 xCodProd : String;
 xEstAnter,
 xEstEntra,
 xTotEntra,
 xEstAloca,
 xTotAloca,
 xEstAtual,
 xEstCarte,
 xEstProdu: Double;

begin
 Produto:= TProduto.Create;
 p_DataIni:= DateEdit1.Date;
 p_DataFim:= DateEdit2.Date;

 SG.Cells[00,0]:= 'PRODUTO';
 SG.Cells[01,0]:= 'peso';
 SG.Cells[02,0]:= 'Valor';
 SG.Cells[03,0]:= 'Est.Ant.'+copy(DateToStr(p_DataIni-1),1,5);
 p_Data:= p_DataIni;
 i:= 4;
 while p_Data <= p_DataFim do begin
  SG.ColCount:= SG.ColCount + 1;
  SG.Cells[i,0]:= copy(DateToStr(p_Data),1,5);
  inc(i);
  p_Data:= p_Data + 1;
 end;
 tq:= TQuery.Create(DmInt);
 tq.DatabaseName:= DmInt.Db.DatabaseName;
 CargasPeriodo(p_DataIni,p_DataFim,tq);
 xcargas:= '';
 while not tq.Eof do begin
  if xcargas='' then
   xcargas:= char(39)+tq.FieldByName('Car_Numero').AsString+char(39)
  else
   xcargas:= xcargas+','+char(39)+tq.FieldByName('Car_Numero').AsString+char(39);

  SG.ColCount:= SG.ColCount + 1;
  SG.Cells[i,0]:= 'Carga'+tq.FieldByName('Car_Numero').AsString;
  inc(i);
  tq.Next;
 end;
 SG.ColCount:= SG.ColCount + 5;
 SG.Cells[i,0]:= 'Est.Atual'; inc(i);
 SG.Cells[i,0]:= 'Em Carteira'; inc(i);
 SG.Cells[i,0]:= 'Peso Cart.'; inc(i);
 SG.Cells[i,0]:= 'Em Prod.'; inc(i);
 SG.Cells[i,0]:= 'Produzir'; inc(i);

 CarregaProdutos(tq);
 i:= 1;
 while not tq.Eof do begin
  SG.RowCount:= SG.RowCount + 1;
  sg.Cells[0,i]:= tq.FieldByName('Pro_Codigo').AsString+'-'+tq.FieldByName('Pro_Nome').AsString;
  inc(i);
  tq.Next;
 end;

 tq.Close;
 tq.Free;

 pb.MaxValue:= (SG.RowCount-1)*(SG.ColCount-1);

 for l:= 1 to SG.RowCount-1 do begin
  xEstAnter:= 0;
  xEstEntra:= 0;
  xTotEntra:= 0;
  xEstAloca:= 0;
  xTotAloca:= 0;
  xEstAtual:= 0;
  for c:= 1 to SG.ColCount -1 do begin
   pb.Progress:= pb.Progress + 1;

   xCodProd:= copy(SG.Cells[0,l],1,11);
   Produto.Recuperar(xCodProd);

   if SG.Cells[c,0] = 'peso' then
    SG.Cells[c,l]:= Formata_Peso(Produto.Pro_pesoliq);

   if SG.Cells[c,0] = 'Valor' then
    SG.Cells[c,l]:= Format_Valor(Produto.Pro_precovenda);

   if copy(SG.Cells[c,0],1,8) = 'Est.Ant.' then begin
    xEstAnter:= SaldoAnterior(p_DataIni,xCodProd);
    SG.Cells[c,l]:= Format_Valor(xEstAnter);
   end;

   if (c > 3) and (copy(SG.Cells[c,0],3,1) = '/') then begin
    xEstEntra:= TotEntrada(StrToDate(copy(SG.Cells[c,0],1,5)+'/'+copy(DateToStr(p_DataFim),7,4)),xCodProd);
    SG.Cells[c,l]:= Format_Valor(xEstEntra);
    xTotEntra:= xTotEntra + xEstEntra;
   end;

   if (c > 3) and (copy(SG.Cells[c,0],1,5) = 'Carga') then begin
    xEstAloca:= TotCarga(Trim(copy(SG.Cells[c,0],6,6)),xCodProd);
    SG.Cells[c,l]:= Format_Valor(xEstAloca);
    xTotAloca:= xTotAloca + xEstAloca;
   end;

   if SG.Cells[c,0] = 'Est.Atual' then begin
    xEstAtual:= xEstAnter+xTotEntra-xTotAloca;
    SG.Cells[c,l]:= Format_Valor(xEstAtual);
   end;

   if SG.Cells[c,0] = 'Em Carteira' then begin
    xEstCarte:= RetornaCarteiraVolumes(xCodProd);
    SG.Cells[c,l]:= Format_Valor(xEstCarte);
   end;

   if SG.Cells[c,0] = 'Peso Cart.' then
    SG.Cells[c,l]:= Formata_Peso(xEstCarte*Produto.Pro_pesoliq);

   if SG.Cells[c,0] = 'Em Prod.' then begin
    xEstProdu:= QtdeProducao(xcargas,xCodProd);
    SG.Cells[c,l]:= Format_Valor(xEstProdu);
   end;

   if SG.Cells[c,0] = 'Produzir' then begin
    SG.Cells[c,l]:= Format_Valor(xEstAtual+xEstProdu-xEstCarte);
   end;


  end; //fim coluna
 end; //fim linha



 Produto.Free;
 exporta.Execute;
 Close;
end;

procedure TfrmConfrontoCargaXEstoque.CargasPeriodo(pDtI, pDtF: TDateTime; var tq: TQuery);
var
 xsql: String;
begin
 xsql:= '';
 tq.Close;
 tq.SQL.Clear;
 xsql:=     'Select Car_numero from Carga '+
            'where ';

 if alocacao=0 then
  xsql := xsql + ' car_fechada=:K_fechada and car_retida=:K_retida ';
 if alocacao=1 then
  xsql := xsql + ' car_fechada=:K_fechada ';
 if alocacao=2 then
  xsql := xsql + ' car_retida=:K_retida ';

 xsql := xsql + ' and Car_Data >=:dtI and Car_Data <=:dtF '+
                'order by Car_Numero';
 tq.sql.add(xsql);

 if alocacao = 0 then begin
   tq.parambyname('K_fechada').AsString := 'N';
   tq.parambyname('K_retida').AsString  := 'N';
 end else begin
   if alocacao = 1 then
     tq.parambyname('K_fechada').AsString:= 'S'
   else
     tq.parambyname('K_retida').AsString := 'S'
 end;
 tq.ParamByName('dtI').AsDateTime:= pDtI;
 tq.ParamByName('dtF').AsDateTime:= pDtF;
 tq.Open;
end;

procedure TfrmConfrontoCargaXEstoque.CarregaProdutos;
begin
 tq.Close;
 tq.SQL.Clear;
 tq.SQL.Add('Select * from Produto where Fase_Codigo = '+QuotedStr('60')+' order by Lin_Codigo,Pro_Codigo');
 tq.Open;
end;

function TfrmConfrontoCargaXEstoque.QtdeProducao(p_Cargas, p_Prod: String): Double;
var tq:TQuery;
begin
  tq              := Tquery.Create(DmInt);
  tq.databasename := dmint.Db.DatabaseName;
  tq.active       := False;
  tq.sql.clear;
  tq.params.clear;
  tq.sql.add('Select sum(ITP_QUANTIDADE-ITP_QTDEPRODUZIDA) as Tot '+
             'from ItemProducao where Car_numero in ('+xCargas+') and '+
             'Pro_Codigo =:Prod');
  tq.ParamByName('Prod').AsString:= p_Prod;
  tq.Open;
  if tq.Eof then
   Result:= 0
  else
   Result:= tq.FieldByName('Tot').AsFloat;
  tq.Close;
  tq.Free;
end;

function TfrmConfrontoCargaXEstoque.RetornaCarteiraVolumes(prod_cod: String): Double;
var
 acabado: String;
 Volume: TVolumes;
 Prod: TProduto;
begin
 Prod:= TProduto.Create;
 Volume:= TVolumes.Create;
 Volume.RecuperarProduto(prod_cod);
 acabado:= Volume.Pro_Codigo;
 if acabado = '' then
  acabado:= prod_cod;
 result:= Prod.Recupera_SaldoPendente(acabado);
 Volume.Free;
 Prod.Free;
end;

function TfrmConfrontoCargaXEstoque.SaldoAnterior(pDt: TDateTime; pProd: String): Double;
var
 tq: TQuery;
begin
 tq:= TQuery.Create(DmInt);
 tq.DatabaseName:= DmInt.Db.DatabaseName;
 tq.Close;
 tq.SQL.Clear;
 tq.SQL.Add('Select sum(fp_quantidade) as Qtde from FichaProduto '+
            'where fp_data <:Data and Pro_Codigo =:Prod');
 tq.ParamByName('data').AsDateTime:= pDt;
 tq.ParamByName('Prod').AsString  := pProd;
 tq.Open;
 Result:= tq.FieldByName('Qtde').AsFloat;
 tq.Close;
 tq.Free;
end;

function TfrmConfrontoCargaXEstoque.TotCarga(pCarga, pProd: String): Double;
var
 tq: TQuery;
 Volume: TVolumes;
 acabado: String;
begin
 Volume:= TVolumes.Create;
 Volume.RecuperarProduto(pProd);
 acabado:= Volume.Pro_Codigo;
 if acabado = '' then
  acabado:= pProd;
 Volume.Free;
 tq:= TQuery.Create(DmInt);
 tq.DatabaseName:= DmInt.Db.DatabaseName;
 tq.Close;
 tq.SQL.Clear;
 tq.SQL.Add('select sum(itc_Quantidade)as Qtde from '+
            'Carga C, Item_Carga i, ItemPedVenda P '+
            'where c.car_numero = i.car_numero and i.ped_numero = p.Ped_numero and i.ped_item = p.ped_item '+
            'and c.car_numero = :carga and Pro_Codigo =:prod');
 tq.ParamByName('carga').AsString := pCarga;
 tq.ParamByName('Prod').AsString  := acabado;
 tq.Open;
 Result:= tq.FieldByName('Qtde').AsFloat;
 tq.Close;
 tq.Free;
end;

function TfrmConfrontoCargaXEstoque.TotEntrada(pDt: TDateTime; pProd: String): Double;
var
 tq: TQuery;
begin
 tq:= TQuery.Create(DmInt);
 tq.DatabaseName:= DmInt.Db.DatabaseName;
 tq.Close;
 tq.SQL.Clear;
 tq.SQL.Add('Select sum(fp_quantidade) as Qtde from FichaProduto '+
            'where fp_data =:Data and Pro_Codigo =:Prod '+
            'and ((NotaC_numero is not null) or (Prod_Numero is null and fp_quantidade >0))');
 tq.ParamByName('data').AsDateTime:= pDt;
 tq.ParamByName('Prod').AsString  := pProd;
 tq.Open;
 Result:= tq.FieldByName('Qtde').AsFloat;
 tq.Close;
 tq.Free;
end;

end.
